package com.jt.Demo02;
/**Spring入门-配置文件版*/
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**Spring在内部维护了一个大型的Map<k,v>集合(容器),bean中的Id充当Map中的key.
 *  实例化的对象充当Map中的value. 形式: Map<Id,实例化对象>
 *  如果拿进来的是字节码对象,那么Map集合中的value也就是实例化对象全部获取其字节码对象,然后查看集合中是否包含传入的字节码对象*/
//            Class<? extends Dog> aClass = dog.getClass();
public class SpringGetDog {
    //该类表示从spring容器中,动态获取Dog对象
    public static void main(String[] args) {
        //1.指定spring配置文件路径
        String resource ="spring.xml";
        //2.启动spring容器  默认条件下,Spring容器启动时,就会创建对象,如果创建对象的过程中,出现问题.则容器启动失败.
        ApplicationContext context = new ClassPathXmlApplicationContext(resource);
        //3.从容器中获取对象  必须强制类型转换
//        Class<Dog> aClass = Dog.class;//字节码文件  .class文件
//        Dog dog = context.getBean(aClass);
        Dog dog1 = (Dog) context.getBean("dog");//通过ID获取 返回值的类型是Object,虽然不报错,但是我们要使用这个值,所以必须强制转换
        Dog dog2 = context.getBean(Dog.class);//通过class获取 返回的值是class类型

        System.out.println(dog1);//输出的是地址值,
        System.out.println(dog2);//地址值相同

        //4.对象调用方法
        dog1.hello();
        dog2.hello();

        //利用反射机制获取对象
        getDog();
    }
    /**Spring 实例化对象的核心原理-反射机制
     * 注意事项:反射代码 在创建对象时 必然会调用对象的无参构造方法*/
    public static void getDog(){
        try {
            Dog dog = (Dog) Class.forName("com.jt.Demo02.Dog").newInstance();
            dog.hello();


        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
